Passed
Branchmaster (df95ba)
by Plamen
01:28
created

table.js ➔ ... ➔ this.loadJS   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 1
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 1
rs 10
cc 1
nc 1
nop 1
1
var strAsc = String.fromCharCode(9650); //▲
2
var strDesc = String.fromCharCode(9660);//▼
3
var xmlhttp; var d;
4
5
var table = new function(){
6
    this.rq = null;
7
    this.tail = [];
8
9
    this.ReloadData = function(tableId){
10
        var request = {};
11
        this.BuildRequest(request,tableId);
12
        this.LoadData(tableId,request);
13
    };
14
15
    this.BuildRequest = function(request, crntTableId, skipPropertyArray){
16
        this.rq = request;
17
        this.checkSkip = function(skipProperty){
18
            var result = false;
19
            if(skipPropertyArray && Object.prototype.toString.call( skipPropertyArray ) === '[object Array]'){
20
                if(skipPropertyArray.indexOf(skipProperty)>=0){
21
                    result = true;
22
                }
23
            }
24
            return result;
25
        };
26
        this.getSort = function(){
27
            var table = document.getElementById(crntTableId);
28
            var thTags = table.getElementsByTagName("thead")[0].getElementsByTagName("th");
29
            for(var i = 0; i < thTags.length; i++ ){
30
                if(thTags[i].getElementsByTagName("a")[0] && thTags[i].getElementsByTagName("a")[0].getElementsByTagName("span").length === 1){
31
                    var spanContent = thTags[i].getElementsByTagName("a")[0].getElementsByTagName("span")[0].innerHTML;
32
                    if(spanContent.length === 1){
33
                        this.rq.colNo = i;
34
                        this.rq.colOrd = (spanContent === window.strDesc) ? "desc" : "asc";
35
                    }
36
                }
37
            }
38
        };
39
        this.getFilter = function(){
40
            var r = this.getFilterFieldsByTbaleID(crntTableId);
41
            if(r.filter !== null){
42
                this.rq.filter = r.filter;
43
            }
44
            if(r.filterBy !== null){
45
                this.rq.filterBy = r.filterBy;
46
            }
47
        };
48
49
        /* Build request object */
50
        if(!this.checkSkip("sort")){            this.getSort();         }
51
        if(!this.checkSkip("filter")){          this.getFilter();       }
52
53
        this.rq.tableId = crntTableId;
54
        return this.rq;
55
    };
56
57
    this.RequestToUrl = function(rq){
58
        var url=location.pathname + ".json" + location.search;
59
        if(typeof rq === "object"){
60
            var getUrlVarName = {colNo: "col", colOrd: "ord", filter: "filter", filterBy: "filter-by", pageNo: "pg", exportType: "export", tableId: "table-id"};
61
            var flagFirst = location.search.length < 1 ? true : false;
62
            for(var r in rq){
1 ignored issue
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
63
                url += (flagFirst===true ? "?" : "&") + getUrlVarName[r] + "=" + rq[r];
64
                flagFirst = false;
65
            }
66
        }
67
        return url;
68
    };
69
70
    this.Filter = function(field){
71
        var request = {};
72
        var isSelect = field.tagName.toLowerCase() === "select";
73
        if(isSelect){
74
            var f = field.parentNode.parentNode.getElementsByTagName("input")[0];
75
            if('' === f.value){
76
                return;
77
            }
78
        }
79
        var crntTableId = isSelect ?
80
                            f.getAttribute("data-table-id") :
0 ignored issues
show
Bug introduced by
The variable f does not seem to be initialized in case isSelect on line 73 is false. Are you sure this can never be the case?
Loading history...
81
                            field.getAttribute("data-table-id");
82
        var exRq = this.rq;
83
        this.BuildRequest(request,crntTableId);
84
        if(exRq===null){
85
            this.LoadData(crntTableId,request);
86
        } else if(  request.filter !== exRq.filter ||
87
                    request.filterBy !== exRq.filterBy
88
        ){
89
            this.LoadData(crntTableId,request);
90
        }
91
    };
92
93
    this.GoPage = function(lnk){
94
        var request = {};
95
        var table = this.getParent(lnk,"table");
96
        var crntTableId = table.getAttribute("id");
97
        this.BuildRequest(request,crntTableId);
98
        //check & serve pagination jump links
99
        var jumpDir=lnk.innerHTML.trim().substr(0,1);
100
        if(jumpDir==="+" || jumpDir==="-"){
101
            var current = table.querySelector("tfoot .paging .a").innerHTML;
102
            var jump = lnk.innerHTML.replace("K","000").replace("M","000000000");
103
            var jumpPage = (parseInt(current)+parseInt(jump));
104
            lnk.parentNode.setAttribute("data-page",jumpPage);
105
            lnk.style.transform="none";
106
        }
107
        request.pageNo = lnk.parentNode.hasAttribute("data-page") ?
108
                         lnk.parentNode.getAttribute("data-page") :
109
                         lnk.innerHTML;
110
        this.LoadData(crntTableId,request);
111
        return false;
112
    };
113
114
    this.Export = function(lnk,eType){
115
        var request = {};
116
        var crntTableId = this.getParent(lnk,"table").getAttribute("id");
117
        this.BuildRequest(request,crntTableId);
118
        request.exportType = ["CSV","Excel"].indexOf(eType)>=0 ? eType : "csv";
119
        window.open(this.RequestToUrl(request));
120
        return false;
121
    };
122
123
    this.Sort = function(colNo,lnk){
124
        var request = {};
125
        var crntTableId = this.getParent(lnk,"table").getAttribute("id");
126
        this.BuildRequest(request,crntTableId);
127
        if(Math.round(colNo) === request.colNo){
128
            request.colOrd = request.colOrd === "asc" ? "desc" : "asc";
129
        } else {
130
            request.colNo=Math.round(colNo);
131
            request.colOrd = "asc";
132
        }
133
        this.LoadData(crntTableId,request);
134
        /* Clear and add new sort arrow */
135
        var headSpans = this.getParent(lnk,"thead").getElementsByTagName("span");
136
        for(var i=0; i < headSpans.length; i++){
137
            headSpans[i].innerHTML = "";
138
        }
139
        lnk.getElementsByTagName("span")[0].innerHTML = (request.colOrd === "desc" ? window.strDesc : window.strAsc);
140
    };
141
142
    this.DrawSection = function(tableContainer, dt, tSection){
143
        var section = tSection === "tfoot" ? "tfoot" : "tbody";
144
        tSection =  document.getElementById(tableContainer).
145
                        getElementsByTagName(section)[0];
146
        this.clearSection(tSection);
147
        for(var i=0; i < dt.length; i++) {
148
            var row = dt[i];
149
            var tRow = document.createElement("tr");
150
151
            this.DrawRow(row, tRow);
152
153
            tSection.appendChild(tRow);
154
            if(section === "tfoot"){
155
                this.footerProcessPaginationLinks(tSection);
156
            }
157
            this.AppendRowCalback(tableContainer);
158
        }
159
    };
160
161
    this.DrawRow = function(row, tRow){
162
        for(var cell in row){
1 ignored issue
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
163
            var tCell = document.createElement("td");
164
            if(typeof row[cell] === "string" || typeof row[cell] === "number"){
165
                tCell.innerHTML = row[cell];
166
            } else if(typeof row[cell] === "object"){
167
                for(var attr in row[cell]){
1 ignored issue
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
168
                    if(typeof row[cell][attr] === "string"){
169
                        tCell.innerHTML = row[cell][attr];
170
                    } else if(typeof row[cell][attr] === "object"){
171
                        for(var v in row[cell][attr]){
1 ignored issue
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
172
                            tCell.setAttribute(v,row[cell][attr][v]);
173
                        }
174
                    }
175
                }
176
            }
177
            tRow.appendChild(tCell);
178
        }
179
    };
180
181
    this.footerProcessPaginationLinks = function(tSection){
182
        var pLinks = tSection.querySelectorAll(".paging a");
183
        if(pLinks.length>0){
184
            for(var j=0; j < pLinks.length; j++){
185
                pLinks[j].setAttribute("href","javascript:void(0);");
186
                pLinks[j].setAttribute("onclick","return table.GoPage(this);");
187
            }
188
        }
189
    };
190
191
    this.clearSection = function(tSection){
192
        if(this.iePrior(9)){
193
            if(tSection.firstChild){
194
                while (tSection.firstChild) {
195
                    tSection.removeChild(tSection.firstChild);
196
                }
197
            }
198
        } else {
199
            tSection.innerHTML="";
200
        }
201
    };
202
203
    this.SetTheTableColumnsHoverEffect = function (tableContainer){
204
        if(this.iePrior(9)) {return;}
205
        var tContainer = document.getElementById(tableContainer);
206
        var tHcells = tContainer.rows[0].cells;
207
        for(var i=0; i < tHcells.length; i++){
208
            if(tHcells[i].firstChild.tagName === "A"){
209
                tHcells[i].firstChild.setAttribute("onmouseover","table.ColumnHover('"+tableContainer+"',"+i+");");
210
                tHcells[i].firstChild.setAttribute("onmouseout","table.ColumnHover('"+tableContainer+"');");
211
            }
212
        }
213
        var pLinks = tContainer.querySelectorAll("tfoot .paging a");
214
        if(pLinks.length>0){
215
            for(var j=0; j < pLinks.length; j++){
216
                pLinks[j].setAttribute("href","javascript:void(0);");
217
                pLinks[j].setAttribute("onclick","return table.GoPage(this);");
218
            }
219
        }
220
    };
221
222
    this.ColumnHover = function(tableContainer,index){
223
        if(this.iePrior(9)) {return;}
224
        var tRow = document.getElementById(tableContainer).rows;
225
        index = Math.round(index);
226
        for(var i=0; i < (tRow.length-1); i++){
227
            if(index >= 0){
228
                tRow[i].cells[index].setAttribute("lang","col-hover");
229
            } else {
230
                for(var j=0; j < tRow[i].cells.length; j++){
231
                    if(tRow[i].cells[j].lang){
232
                        tRow[i].cells[j].removeAttribute("lang");
233
                    }
234
                }
235
            }
236
        }
237
    };
238
239
    this.getFilterFieldsByTbaleID = function(tableID){
240
        var fields = {filterBy:null, filter:null};
241
        var filterDiv = this.getFilterDivByTableIDOrNull(tableID);
242
        if(filterDiv!==null) {
243
            var selectObj = filterDiv.getElementsByTagName("select")[0];
244
            var textObj = filterDiv.getElementsByTagName("input")[0];
245
            fields.filterBy = (selectObj===null || selectObj.options[selectObj.selectedIndex].value==="all") ? null : selectObj.options[selectObj.selectedIndex].value;
246
            fields.filter = (textObj===null || textObj.value.length === 0) ? null : encodeURIComponent(textObj.value.trim());
247
        }
248
        return fields;
249
    };
250
251
    this.getFilterDivByTableIDOrNull = function(tableID){
252
        var res = null;
253
        if(document.getElementById(tableID).parentNode.getElementsByTagName("div").length > 0){
254
            for (var i = 0; i < document.getElementById(tableID).parentNode.getElementsByTagName("div").length; i++) {
255
                if(document.getElementById(tableID).parentNode.getElementsByTagName("div")[i].getAttribute("class")==="filter"){
256
                    return document.getElementById(tableID).parentNode.getElementsByTagName("div")[i];
257
                }
258
            }
259
260
        }
261
        return res;
262
    };
263
264
    this.LoadData = function(tableContainer,rq){
265
        this.setVisability(tableContainer, false);
266
        if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); /* code for IE7+, Firefox, Chrome, Opera, Safari */
267
        } else {  xmlhttp=new /** global: ActiveXObject */ActiveXObject("Microsoft.XMLHTTP"); /* code for IE6, IE5 */}
0 ignored issues
show
Bug introduced by
The variable ActiveXObject seems to be never declared. If this is a global, consider adding a /** global: ActiveXObject */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
268
        for (var i = 0; i < this.tail.length; i++) {
269
            var ex_xmlhttp = this.tail.shift();
270
            ex_xmlhttp.abort();
271
        }
272
        xmlhttp.onreadystatechange = function() {
273
            if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
274
                d = JSON.parse(xmlhttp.responseText);
275
                table.DrawSection(tableContainer,d.body);
276
                table.DrawSection(tableContainer,d.footer,"tfoot");
277
                table.LoadEndCalback(tableContainer);
278
                table.setVisability(tableContainer, true);
279
                if(typeof rq === "object"){
280
                    table.ColumnHover(tableContainer,rq.colNo);
281
                }
282
            }
283
        };
284
        xmlhttp.open("GET", this.RequestToUrl(rq), true);
285
        xmlhttp.send();
286
        this.tail.push(xmlhttp); //put in tail to may later abort any previous
287
    };
288
289
    this.setVisability = function(tableContainer,rq){
290
        var tbl = document.getElementById(tableContainer);
291
        if(rq===true){
292
            tbl.style.filter = "none";
293
            tbl.style.opacity = "1";
294
            tbl.style.cursor = "auto";
295
        } else if(rq===false){
296
            tbl.style.filter = "blur(1px)";
297
            tbl.style.opacity = "0.8";
298
            tbl.style.cursor = "wait";
299
        } else { console.log("table error in the rq value");}
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
300
    };
301
302
    this.getParent = function (obj,objType){
303
        while( obj && obj.tagName !== objType.toUpperCase() ){
304
            obj = obj.parentNode;
305
        } return obj;
306
    };
307
308
    this.init = function(tableId){
309
        this.SetTheTableColumnsHoverEffect(tableId);
310
    };
311
312
    this.iePrior = function(v) {var rv=false; if(/** global: navigator */navigator.appName==='Microsoft Internet Explorer') {var ua=navigator.userAgent; var re=new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); if(re.exec(ua)!==null) rv=parseFloat(RegExp.$1); rv=rv<v?true:false; } return rv;};
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
Bug introduced by
The variable navigator seems to be never declared. If this is a global, consider adding a /** global: navigator */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
313
    this.loadJS = function(src){ var s = document.createElement('script'); s.src = src; document.getElementsByTagName('head')[0].appendChild(s);};
314
    this.loadCSS = function(src){ var s = document.createElement('link'); s.href = src; s.rel="stylesheet"; document.getElementsByTagName('head')[0].appendChild(s);};
315
316
    this.LoadEndCalback = function(tableId){};
0 ignored issues
show
Unused Code introduced by
The parameter tableId is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
317
    this.AppendRowCalback = function(tableId){};
0 ignored issues
show
Unused Code introduced by
The parameter tableId is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
318
};
319
320
/** Moves custom created filter to the Table's filter
321
 * @param {string} filterId
322
 * @param {string} tableId
323
 * @param {boolean} delay - needed in case the table is istill not executed */
324
function moveSelectorToTheTableFilter(filterId, tableId, delay){
325
    if(delay===true){
326
        setTimeout(function(){
327
            var filterDiv = document.getElementById(tableId).getElementsByTagName("div")[0];
328
            filterDiv.appendChild(document.getElementById(filterId));
329
        },500);
330
    } else {
331
        filterDiv = document.getElementById(tableId).getElementsByTagName("div")[0];
0 ignored issues
show
Bug introduced by
The variable filterDiv seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.filterDiv.
Loading history...
332
        filterDiv.appendChild(document.getElementById(filterId));
333
    }
334
}
335
function changeListCustomFilter(selectObj){
336
    var fId = selectObj.options[selectObj.selectedIndex].value;
337
    var varName = selectObj.getAttribute("name");
338
    var varPos = document.URL.indexOf(varName);
339
    if(varPos>0){
340
        var url = fId!=="{!--Empty--!}" ? document.URL.substring(0,varPos) : document.URL.substring(0,(varPos-1));
341
    } else {
342
        var separator = document.URL.indexOf("?")>0 ? "&" : "?";
343
        url = document.URL + (fId!=="{!--Empty--!}" ? separator : "");
344
    }
345
    var newUrl = url + (fId!=="{!--Empty--!}" ? (varName + "=" + fId) : "");
346
    location.assign(newUrl);
347
}
348
349
350
function tablesLoadData(){
351
    var tables = document.getElementsByTagName("table");
352
    for (var i = 0; i < tables.length; i++) {
353
        if((table.iePrior(9) ? (typeof tables[i]["data-table"]!== 'undefined') : tables[i].hasAttribute("data-table")) && tables[i].getAttribute("data-table") === "js"){
354
            table.LoadData(tables[i].id);
355
            table.SetTheTableColumnsHoverEffect(tables[i].id);
356
        }
357
    }
358
    if(table.iePrior(10)){
359
        table.loadJS("/add/helpers/table/add/json2.js");
360
    }
361
362
    /*if(table.iePrior(8)){ //can be used to add apropriate tables links modifications
363
        // loadCSS("/add/helpers/table/add/ie7-and-down.css");
364
    }*/
365
}
366
367
/*if(window.addEventListener){window.addEventListener('load',tablesLoadData,false);} else if(window.attachEvent){window.attachEvent('onload',tablesLoadData);}*/